#pragma once

#include <algorithm>
#include <openssl/sha.h>
#include "../hash.hpp"

namespace alpha { namespace crypto {
	
namespace detail {
		
struct sha1_traits
{
	enum {digest_length = 20};

	typedef SHA_CTX context_type;

	static void init(context_type *ctx)
	{
		SHA1_Init(ctx);
	}

	static void update(context_type *ctx, boost::uint8_t const *buf, boost::uint32_t len)
	{
		SHA1_Update(ctx, buf, len);
	}

	static void final(boost::uint8_t *digest, context_type *ctx)
	{
		SHA1_Final(digest, ctx);
	}

};

} // namespace detail

typedef basic_hash<detail::sha1_traits> sha1;

}} // namespace alpha::crypto
